/**
  ******************************************************************************
  * @file    spi.c
  * @author  TONLY
  * @version V1.0
  * @date    2022-01-01
  * @brief   spi配置
  ******************************************************************************
  * @attention
  * 
  *	本程序只供学习使用，未经作者许可，不得用于其它任何用途
  *	版权所有，盗版必究
  *
  * <h2><center>&copy; COPYRIGHT 2022 华清-TONLY </center></h2>
  ******************************************************************************
  */  
  
/* Includes ------------------------------------------------------------------*/

#include "spi.h"


/**
  * @brief  SPI1初始化
  * @param  None
  * @retval None
  */
void SPI1_Init(void)
{
	static u8 isSPI1Init = 0;
	GPIO_InitTypeDef GPIO_InitStruct;
	SPI_InitTypeDef SPI_InitStruct;
	
	if(isSPI1Init)
		return;
	
	//开时钟
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1,ENABLE);
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
	
	// 重映射
	GPIO_PinRemapConfig(GPIO_Remap_SWJ_Disable, ENABLE);
	GPIO_PinRemapConfig(GPIO_Remap_SPI1, ENABLE);
	
	//引脚配置 PB3 PB5 复用功能推挽输出
	GPIO_InitStruct.GPIO_Mode 		= GPIO_Mode_AF_PP;
	GPIO_InitStruct.GPIO_Pin 		  = GPIO_Pin_3 | GPIO_Pin_5;
	GPIO_InitStruct.GPIO_Speed 		= GPIO_Speed_50MHz;
	GPIO_Init(GPIOB,&GPIO_InitStruct);
	//引脚配置 PB4 浮空输入
	GPIO_InitStruct.GPIO_Mode 		= GPIO_Mode_IN_FLOATING;
	GPIO_InitStruct.GPIO_Pin 		  = GPIO_Pin_4;
	GPIO_Init(GPIOB,&GPIO_InitStruct);
	
	//SPI1配置
	SPI_InitStruct.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256; 	//波特率预分频值，LD3320可接受范围4-48MHz
	SPI_InitStruct.SPI_CPHA 				     = SPI_CPHA_1Edge;				//时钟相位，在第一个时钟边沿采样
	SPI_InitStruct.SPI_CPOL					     = SPI_CPOL_High;				//时钟极性，空闲时呈现高电平
	SPI_InitStruct.SPI_DataSize				   = SPI_DataSize_8b;				//8位数据
	SPI_InitStruct.SPI_CRCPolynomial		 = 7;							//CRC校验值，此时不需要
	SPI_InitStruct.SPI_Direction			   = SPI_Direction_2Lines_FullDuplex;//设置为双线双向全双工
	SPI_InitStruct.SPI_FirstBit			     = SPI_FirstBit_MSB;				//高位先行
	SPI_InitStruct.SPI_Mode              = SPI_Mode_Master;				//主SPI
	SPI_InitStruct.SPI_NSS               = SPI_NSS_Soft;					//片选由软件控制
	SPI_Init(SPI1,&SPI_InitStruct);
	
	SPI_I2S_ClearFlag(SPI1,SPI_I2S_FLAG_TXE|SPI_I2S_FLAG_RXNE);
	
	SPI_Cmd(SPI1,ENABLE);
	
	isSPI1Init = 1;
}

/**
  ********************************************************
  * @brief	SPI1发送和接受数据
  * @param 	TxData  发送的数据
  *	@retval 接受数据
  ********************************************************
  */
uint8_t SPI1_Rx_Tx_Byte(uint8_t TxData)
{
	while(SPI_I2S_GetFlagStatus(SPI1,SPI_I2S_FLAG_TXE)== RESET);
	SPI_I2S_SendData(SPI1,TxData);
	
	while(SPI_I2S_GetFlagStatus(SPI1,SPI_I2S_FLAG_RXNE)== RESET);	
	return (uint8_t)SPI_I2S_ReceiveData(SPI1);	
}





/******************* (C) COPYRIGHT 2022 华清-TONLY *************END OF FILE****/
